import { _decorator, Component, Node, Prefab, instantiate, input, Input, tween, Vec3, Collider2D, Contact2DType, Label, AnimationComponent, director, AudioClip, AudioSource } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('Player')
export class Player extends Component {

    // Prefab预制体就是保存节点配置，在需要的时候随时生成(节点模板)
    // 1，制作箭的预制体
    // 2，导入箭的预制体到脚本
    // 3，把预制体生成为节点 语句：instantiate(预制体对象)
    // 4，设置该节点的父节点(让其显示) 语句：节点.setParent(父节点对象)



    // 监听类型(触摸开始)：Input.EventType.TOUCH_START
    // 平滑移动语句：tween(节点).to(移动时间, {position: new Vec3(位置坐标)})
    // 平滑移动回调：平滑移动语句.call(() => {函数体})
    // 播放平滑移动：平滑移动语句 + 回调(可选).start()
    // 本地坐标：相对于父节点的相对位置(不唯一，可能重复)
    // 世界坐标：相对于场景的绝对位置(唯一坐标)
    // 修改世界坐标，本地坐标也会跟随改动。修改本地坐标，世界坐标也会跟随改变

    // 1，获取箭自身节点的世界坐标 语句：节点.getWorldPosition()
    // 2，设置箭自身节点的父节点(箭靶节点)
    // 3，设置箭自身节点的世界坐标 语句：节点.setWorldPosition(世界坐标)
    // 4，设置箭自身节点的旋转角度为箭靶的反向旋转值

    // 监听类型(碰撞触发)：Contact2DType.BEGIN_CONTACT

    //旋转节点：

    @property(Node)//导入箭靶组件 
    Target_Node: Node = null

    @property(Node)//导入箭的父节点
    Arrow_Top_Node: Node = null

    @property(Node)//导入提示框节点
    Tips_Node: Node = null

    @property(Prefab)//导入箭的预制体
    Arrow_Prefab: Prefab = null

    @property(Label)//导入箭的预制体
    Tips_Label: Label = null

    @property(Label)//导入总数量文本
    Tips_All_Label: Label = null

    @property(Label)//导入当前数量文本
    Tips_New_Label: Label = null


    @property({ type: AnimationComponent })//导入按键播放动画
    Button_Animation: AnimationComponent = null

    // AudioSource音频组件
    // AudioClip音频资源
    // 1，导入音频资源
    // 2，获取音频组件  语句：节点.getComponent(组件类型)
    // 3，指定音频资源  语句：音频组件.clip = 音频资源
    // 4，开始播放音频  语句：音频组件.play()

    @property(AudioClip)//导入成功音频文件
    Win_AudioClip: AudioClip = null
    @property(AudioClip)//导入失败音频文件
    Low_AudioClip: AudioClip = null




    Arrow_Node: Node = null//箭的自身节点

    Angle = 0 //初始旋转角度
    @property
    Angle_Speed = 50 //旋转速度

    Move = true;//是否移动

    All_Num = 15;//初始化总数量
    New_Num = 0;//初始化当前数量
    Up_Sw = true;



    protected onLoad(): void {
        input.on(Input.EventType.TOUCH_START, this.TOUCH_START, this)
    }

    protected onDestroy(): void {
        input.off(Input.EventType.TOUCH_START, this.TOUCH_START, this)
    }
    TOUCH_START() {//触摸开始执行
        const Arrow_Node = instantiate(this.Arrow_Prefab); //把预制体生成为节点
        Arrow_Node.setParent(this.Arrow_Top_Node); //设置该节点的父节点(让其显示)

        Arrow_Node.getComponent(Collider2D).on(Contact2DType.BEGIN_CONTACT, this.BEGIN_CONTACT, this); //监听碰撞触发事件


        //Arrow_Node.setPosition(0, 128.216, 0); //设置箭的初始位置
        tween(Arrow_Node).to(0.5, { position: new Vec3(0, 128.216, 0) }).call(() => {
            this.Arrow_to_Target(Arrow_Node)
            Arrow_Node.getComponent(Collider2D).off(Contact2DType.BEGIN_CONTACT, this.BEGIN_CONTACT, this);//取消碰撞触发事件
        }).start()
    }

    BEGIN_CONTACT() {
        this.Up_Sw = false;
        this.Tips_UI(false);

    }

    Win_AudioClip_Play() {
        const Audio = this.node.getComponent(AudioSource)//获取音频组件
        Audio.clip = this.Win_AudioClip//指定音频资源
        Audio.play()//开始播放音频
    }

    Low_AudioClip_Play() {
        const Audio = this.node.getComponent(AudioSource)//获取音频组件
        Audio.clip = this.Low_AudioClip//指定音频资源
        Audio.play()//开始播放音频
    }

    Tips_UI(a) {
        this.Move = false;
        input.off(Input.EventType.TOUCH_START, this.TOUCH_START, this)
        this.Tips_Node.active = true; //显示提示框
        this.Button_Animation.play('D') //播放按键动画
        //this.Button_Animation.stop('D')//停止
        if (!a) {
            this.Tips_Label.string = "Game Over"; //显示游戏结束提示
        } else {
            this.Tips_Label.string = "You Win"; //显示游戏胜利提示
        }
    }
    Up_Num() {
        if (!this.Up_Sw) {
            this.Low_AudioClip_Play();
            return;
        }
        this.Win_AudioClip_Play();
        this.New_Num++;
        this.Tips_New_Label.string = '已射入' + this.New_Num + '把宝剑';//显示当前数量

        if (this.New_Num >= this.All_Num) {
            this.Tips_UI(true);
        }

    }



    Arrow_to_Target(Arrow_Node) {//箭的平滑移动到箭靶位置
        const World_Pos = Arrow_Node.getWorldPosition(); //获取箭自身节点的世界坐标
        Arrow_Node.setParent(this.Target_Node)//设置父节点
        Arrow_Node.setWorldPosition(World_Pos); //设置箭自身节点的世界坐标
        Arrow_Node.angle = -this.Target_Node.angle; //设置箭自身节点的旋转角度为箭靶的反向旋转值
        this.Up_Num();
    }


    New_Game() {
        // director.loadScene("C1");
        // 重置所有数据
        this.New_Num = 0;
        this.Up_Sw = true;
        this.Move = true;
        this.Angle = 0;
        this.Target_Node.angle = 0;

        // 清空箭的父节点
        this.Arrow_Top_Node.removeAllChildren();

        // 清空靶子上的箭
        this.Target_Node.removeAllChildren();


        // 重置提示框
        this.Tips_Node.active = false;
        this.Tips_Label.string = "";
        this.Tips_All_Label.string = '目标：射入' + this.All_Num + '把宝剑';
        this.Tips_New_Label.string = '当前：' + this.New_Num + ' 把';

        // 重新绑定触摸事件
        input.on(Input.EventType.TOUCH_START, this.TOUCH_START, this);
    }

    start() {
        // this.Arrow_Node = instantiate(this.Arrow_Prefab); //把预制体生成为节点
        // this.Arrow_Node.setParent(this.Arrow_Top_Node); //设置该节点的父节点(让其显示)

        this.Tips_All_Label.string = '目标：射入' + this.All_Num + '把宝剑'
        this.Tips_New_Label.string = '当前：' + this.New_Num + ' 把'

    }

    update(deltaTime: number) {

        if (!this.Move) return;//如果不移动则直接返回

        if (this.Angle <= -360) { this.Angle = 0 }//角度旋转1圈恢复到0度

        this.Angle -= deltaTime * this.Angle_Speed; //接收旋转角度(帧时间补偿)
        this.Target_Node.angle = this.Angle; //改变旋转角度
    }
}


